package ar.fiuba.tp7552.buildadmin.model.builds;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;

import ar.fiuba.tp7552.buildadmin.model.BaseEntity;
import ar.fiuba.tp7552.buildadmin.model.expensas.LiquidacionExpensas;
import ar.fiuba.tp7552.buildadmin.model.expensas.TipoInteres;
import ar.fiuba.tp7552.buildadmin.model.gastos.Gasto;
import ar.fiuba.tp7552.buildadmin.model.gastos.Prorrateo;
import ar.fiuba.tp7552.buildadmin.model.gastos.TipoGasto;

public class Edificio extends BaseEntity {
	
	private String nombre;
	private String calle;
	private String nro;
	private String localidad;
	private Boolean aptoProfesional;
	private Encargado encargado = new Encargado();
	private LiquidacionExpensas liqExpensas = LiquidacionExpensas.MONTO_FIJO;
	private BigDecimal fondoOrdinario = BigDecimal.ZERO;
	private BigDecimal fondoExtOrdinario = BigDecimal.ZERO;
	
	private PlanPago planPago;
	private Double tasaAnual;
	private Integer vencimiento1;
	private Integer vencimiento2;
	private TipoInteres tipoInteres;
	
	private Collection<TipoPropiedad> tipoProps = new HashSet<TipoPropiedad>();
	private Collection<Gasto> gastos = new HashSet<Gasto>();
	
	
	
	
	public Collection<Propiedad> getPropiedades(){
		Collection<Propiedad> propiedades = new LinkedHashSet<Propiedad>();
		for ( TipoPropiedad tprop : tipoProps ) {
				propiedades.addAll(tprop.getPropiedades());	
		}
		return propiedades;	
	}
	
	
	/**
	 * Obtiene una coleccion con todos los {@link TipoGasto} asociados
	 * a todos los {@link TipoPropiedad} del Edificio. 
	 */
	public Collection<TipoGasto> getTipoGastos() {
		Collection<TipoGasto> tipogastos = new LinkedHashSet<TipoGasto>();
		for ( TipoPropiedad tprop : tipoProps ) {
			for (Prorrateo prorrateo : tprop.getProrrateos()) {
				tipogastos.add(prorrateo.getTipoGasto());	
			}
		}
		return tipogastos;		
	}
	
	//~~ getters y setters ===========================================================
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getCalle() {
		return calle;
	}
	public void setCalle(String calle) {
		this.calle = calle;
	}
	public String getNro() {
		return nro;
	}
	public void setNro(String nro) {
		this.nro = nro;
	}
	public String getLocalidad() {
		return localidad;
	}
	public void setLocalidad(String localidad) {
		this.localidad = localidad;
	}
	public Boolean getAptoProfesional() {
		return aptoProfesional;
	}
	public void setAptoProfesional(Boolean aptoProfesional) {
		this.aptoProfesional = aptoProfesional;
	}
	public Encargado getEncargado() {
		return encargado;
	}
	public void setEncargado(Encargado encargado) {
		this.encargado = encargado;
	}
	public Collection<TipoPropiedad> getTipoProps() {
		return tipoProps;
	}
	public void setTipoProps(Collection<TipoPropiedad> tipoProps) {
		this.tipoProps = tipoProps;
	}
	public Collection<Gasto> getGastos() {
		return gastos;
	}
	public void setGastos(Collection<Gasto> gastos) {
		this.gastos = gastos;
	}
	public LiquidacionExpensas getLiqExpensas() {
		return liqExpensas;
	}
	public void setLiqExpensas(LiquidacionExpensas liqExpensas) {
		this.liqExpensas = liqExpensas;
	}
	public BigDecimal getFondoOrdinario() {
		return fondoOrdinario;
	}
	public void setFondoOrdinario(BigDecimal fondoOrdinario) {
		this.fondoOrdinario = fondoOrdinario;
	}
	public BigDecimal getFondoExtOrdinario() {
		return fondoExtOrdinario;
	}
	public void setFondoExtOrdinario(BigDecimal fondoExtOrdinario) {
		this.fondoExtOrdinario = fondoExtOrdinario;
	}
	public PlanPago getPlanPago() {
		return planPago;
	}
	public void setPlanPago(PlanPago planPago) {
		this.planPago = planPago;
	}
	public Double getTasaAnual() {
		return tasaAnual;
	}
	public void setTasaAnual(Double tasaAnual) {
		this.tasaAnual = tasaAnual;
	}
	public Integer getVencimiento1() {
		return vencimiento1;
	}
	public void setVencimiento1(Integer vencimiento1) {
		this.vencimiento1 = vencimiento1;
	}
	public Integer getVencimiento2() {
		return vencimiento2;
	}
	public void setVencimiento2(Integer vencimiento2) {
		this.vencimiento2 = vencimiento2;
	}
	public TipoInteres getTipoInteres() {
		return tipoInteres;
	}
	public void setTipoInteres(TipoInteres tipoInteres) {
		this.tipoInteres = tipoInteres;
	}
}
